package com.hbsi.demo2;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author 程奕红
 * @version 1.0
 */
@SuppressWarnings("all")
public class Reflectdemo5 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //对Person类型进行分析，获取Person中的相关方法，并且调用
        Class classz= Person.class;
        Method[] methods = classz.getMethods();//是一个方法类型的数组
        for(Method m:methods){//getMethod:返回该类中公有的方法和从父类Object中继承的方法
            System.out.println(m);
        }
        System.out.println("------------------------");//getDeclaredMethods:返回该类中新定义的方法，包括各种权限
        Method[] methods1= classz.getDeclaredMethods();
        for(Method m:methods1){
            System.out.println(m);
        }
        System.out.println("-----------------------");//通过方法名和参数来确定一个方法---方法有重载
        Method showM=classz.getMethod("show");
        System.out.println(showM);

        Person p=new Person();
        showM.invoke(p);//表示调用方法show(),通过p对象     等价于p.show();
        System.out.println("--------------------------------------");
       Method mMethod= classz.getMethod("method", String.class);//需要带名字和参数来获取这个方法
        mMethod.invoke(p,"Jack");
        System.out.println(mMethod);
        System.out.println("------------------------");
        Method getString=classz.getMethod("getString", String.class, int.class);
        System.out.println(getString);
       Object o1= getString.invoke(p,"jack",19);
        System.out.println(o1);//有返回值的情况
        System.out.println("========================================");
//        Method funM=classz.getMethod("function");function()是private,通过getMethod()拿不到
        Method funM=classz.getDeclaredMethod("function");
        System.out.println(funM);
        funM.setAccessible(true);//暴力破解，可以调用私有的方法
        funM.invoke(p);
        System.out.println("---------------------");
        Method Mdisplay=classz.getMethod("display");
        Mdisplay.invoke(null);
    }
}
